package io.github.echarts.render.component;

import io.github.echarts.model.component.Component;
import io.github.echarts.model.component.ComponentType;
import io.github.echarts.render.GraphicsRenderer;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 组件渲染协调器
 * 负责协调所有组件的渲染过程，管理组件渲染器
 */
public class ComponentRenderingCoordinator {
    
    /** 组件渲染器映射表 */
    private Map<ComponentType, ComponentRenderer> rendererMap;
    
    /** 待渲染的组件列表 */
    private List<Component> components;
    
    /**
     * 构造函数
     */
    public ComponentRenderingCoordinator() {
        rendererMap = new HashMap<>();
        components = new ArrayList<>();
        
        // 注册默认渲染器
        registerDefaultRenderers();
    }
    
    /**
     * 注册组件渲染器
     * 
     * @param renderer 组件渲染器
     */
    public void registerRenderer(ComponentRenderer renderer) {
        rendererMap.put(renderer.getSupportedComponentType(), renderer);
    }
    
    /**
     * 注册默认的组件渲染器
     * 为不同类型的组件注册默认渲染器实现
     */
    private void registerDefaultRenderers() {
        // 目前尚未实现具体的组件渲染器
        // 在实现各组件渲染器后，将在此处注册
        
        // 示例：如果这些类已经实现，则取消注释以下代码
        // registerRenderer(new TitleRenderer());
        // registerRenderer(new LegendRenderer());
        // registerRenderer(new AxisRenderer());
        
        // 注册一个默认渲染器，处理未知组件类型
        registerRenderer(new DefaultComponentRenderer());
    }
    
    /**
     * 添加待渲染的组件
     * 
     * @param component 待渲染的组件
     */
    public void addComponent(Component component) {
        components.add(component);
    }
    
    /**
     * 添加多个待渲染的组件
     * 
     * @param components 待渲染的组件列表
     */
    public void addComponents(List<Component> components) {
        if (components != null) {
            this.components.addAll(components);
        }
    }
    
    /**
     * 渲染所有组件
     * 
     * @param renderer 图形渲染器
     */
    public void renderComponents(GraphicsRenderer renderer) {
        // 按照Z轴层级排序
        components.sort((c1, c2) -> Integer.compare(c1.getZLevel(), c2.getZLevel()));
        
        // 渲染每个组件
        for (Component component : components) {
            if (component.isVisible()) {
                renderComponent(component, renderer);
            }
        }
    }
    
    /**
     * 渲染单个组件
     * 
     * @param component 待渲染的组件
     * @param renderer 图形渲染器
     */
    private void renderComponent(Component component, GraphicsRenderer renderer) {
        ComponentType type = component.getType();
        ComponentRenderer componentRenderer = rendererMap.get(type);
        
        if (componentRenderer != null) {
            componentRenderer.render(component, renderer);
        } else {
            // 处理没有找到渲染器的情况
            System.err.println("未找到组件类型 " + type + " 的渲染器");
        }
    }
    
    /**
     * 清空所有待渲染的组件
     */
    public void clearComponents() {
        components.clear();
    }
    
    /**
     * 默认组件渲染器
     * 提供基本的渲染功能，用于处理未注册专用渲染器的组件
     */
    private static class DefaultComponentRenderer implements ComponentRenderer {
        @Override
        public void render(Component component, GraphicsRenderer renderer) {
            // 提供最基本的渲染实现
            // 仅用于开发阶段，实际使用时应该为每种组件提供专门的渲染器
            System.out.println("使用默认渲染器渲染组件: " + component.getType());
        }
        
        @Override
        public ComponentType getSupportedComponentType() {
            // 支持所有组件类型，作为默认实现
            return null;
        }
    }
} 